home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / docs / asm_guide / assembler course / doctext2-assembler < prev    next >
Text File  |  1992-04-27  |  52KB  |  1,190 lines

  1.  
  2.     1st I gotta tell some important detail about machincode I forgot
  3.     to tell last time.
  4.  
  5.     MOVE.W label,d0        moves the first 2 bytes following the
  6.                 label. This should sound familiar to you.
  7.     example:
  8.  
  9.       (    label1:        dc.b    $05,$e2,$34,$4a ..... 
  10.     label2:        dc.b    0,0,0,0....
  11.       )
  12.     move.w    label1,label2    ; moves #$05e2 into the first word of label2
  13.     move.l    label1,label2    ; moves #$05e2344a into label2
  14.  
  15.     Right, this is nothing new, but now what I forgot to say:
  16.  
  17.     if you move something from the dataregisters or addressregisters,
  18.     allways the rightmost part is taken !!
  19.  
  20.     example: d0 contains #$05e2344a
  21.  
  22.     move.w    d0,label    ; moves #$344a into label (and not #$05e2)
  23.     move.b    d0,label    ; moves #$4a into label (and not #$05)
  24.  
  25.     move.b    #$20,d0        ; moves #$20 into the rightmost byte of d0
  26.                 ; (the rest is unaffected)
  27.     move.w    #$20,d0        ; moves #$0020 into the rightmost word of d0
  28.                 ; (the rest is unaffected)
  29.  
  30.     same counts for addressregisters, but most of the time longwords
  31.     are used here. (it's even impossible to move bytes into/from
  32.     addressregisters, only words or longwords)
  33.  
  34.     I forgot to tell you this coz it is so 'normal' to me.
  35.  
  36.     Another instruction that I used in the mouse-source is EXT
  37.     EXT means EXTEND SIGN BIT.
  38.     As you know, values are stored in BYTES, WORDS or LONGWORDS,
  39.     and it is only because you tell the computer what size he must
  40.     use, that he knows whether it is meant to be byte, word or longword.
  41.     Value 5 will be written as #$05, #$0005 or #$00000005 depending
  42.     on the size. This example is no big problem if you wanna move it:
  43.     
  44.         clr.l    d0
  45.         move.b    label,d0
  46.         move.l    d0,d1
  47.  
  48.         label:    dc.b    5
  49.  
  50.     the BYTE 5 will be moved into d0, and the LONGWORD 5 will be then
  51.     moved into d1...
  52.  
  53.     BUT !!! Negative values make a problem, because a negative value is
  54.     in fact not really negative... let's try to explain it with this 
  55.     example:
  56.         #$06 + #$00 = #$06
  57.         #$06 + #$ff = #$05    ( 6 - 1 = 5  !!     #$ff = -1 )
  58.         #$06 + #$fe = #$04    ( 6 - 2 = 4  !!     #$fe = -2 )
  59.  
  60.     Now look what happens when we use WORDS:
  61.  
  62.         #$0006 + #$0000 = #$0006
  63.         #$0006 + #$ffff = #$0005  ( 6 - 1 = 5 !!    #$ffff = -1 )
  64.      but:    #$0006 + #$00ff = #$0105  ( #$00ff <> -1 !!)
  65.         #$0006 + #$fffe = #$0004  ( 6 - 2 = 4 !!    #$fffe = -2 )
  66.      but:    #$0006 + #$00fe = #$0104  ( #$00ff <> -2 !!)
  67.  
  68.     As you see : a negative BYTE is not a negative number as WORD.
  69.     EXT makes from a negative BYTE a negative WORD: if the last bit
  70.     (in a byte: 7th bit) is SET, ext will SET all bits left of it, so
  71.     that #$fe will become #$fffffffe, and then you can use this value
  72.     again as negative value)
  73.  
  74.  
  75.     CUSTOM CHIPS & REGISTERS
  76.     ------------------------
  77.  
  78.     You probably know that Amiga has, except for the Motorola 68000,
  79.     some other 'custom-made' chips to perform tasks like graphic-
  80.     handling, sound, disk-operations,... In demos, these are the most
  81.     important things, so it's obvious that we'll have to access these
  82.     chips to make demos. NOW that's why the hardware addresses (of which
  83.     I told about all the time) are used. Imagine Agnus, Paula or Denise,
  84.     (that's the names of the customchips) with the pins of the chip 
  85.     attached to each a hardware address. (that's not the real situation,
  86.     but it gets close)
  87.     These hardware registers start at the address $DFF000. If you refer
  88.     to list nr 2 somewhere among the copies, you'll see all the addresses
  89.     that are available. As said, each of these addresses is in fact a
  90.     port to one of the customchips, but it's not interesting nor important
  91.     to know which address belongs to which chip. Instead you just have
  92.     to know their function, and this is what we're now gonna do.
  93.  
  94.  
  95.     You can divide the special Amiga features into 6 parts:
  96.  
  97.     - BITPLANES (these are the screens with gfx)
  98.     - COPPER (to put values in hardware registers when electronbeam of
  99.           monitor reaches a given value)
  100.     - BLITTER (to transfer/fill parts of memory and to draw lines, very
  101.            fast!)
  102.     - SPRITES (graphical objects that can be moved easily across screen)
  103.     - DISK
  104.     - AUDIO
  105.  
  106.     You already met the copper, probably you also know some other ones,
  107.     but if not so, don't panic: everything will be explained later. Now
  108.     just remember that they exist.
  109.     Each of these parts can be accessed and used thru the hardware
  110.     registers. If you want a sprite, you move certain values to certain
  111.     registers. This way of programming is called DIRECT MEMORY ACCESS 
  112.     (DMA). The libraries of which I told you before are in fact meant to
  113.     keep the programmer away from DMA, because DMA is hardware-related,
  114.     and hardware can change (for example some Amiga500 demos don't work
  115.     on an A1000, because they make use of changed hardware-parts)
  116.     Another good example of the 'danger' of hardware programming is that 
  117.     most 'first-demos' of beginning programmers don't work on Amigas
  118.     with extra memory, also because of the difference in hardware.
  119.     But it's a bit too early to worry about this. Let's first go on 
  120.     with the important stuff.
  121.  
  122.     All registers have a length of 1 WORD !!! (16 bits) 
  123.     On page '!', you can see some names of registers, with numbers from
  124.     15 to 0, with each some explanation behind them. These are ofcourse
  125.     the bits of the register. In some regs, each BIT has a function,
  126.     which you can turn on/off by setting/clearing the corresponding bit.
  127.     (that's why the binary notation of seka (%) could come in handy)
  128.     (don't forget that the first bit is called 'bit 0', so 'bit 4' is in
  129.      fact the fifth in the row)
  130.  
  131.     Most hardware registers can either be read from, or written into.
  132.     For some functions you have a register to write into and another to
  133.     read from. Writing in a 'read-only' register has no effects. However,
  134.     reading from 'write-only' regs can cause strange effects, or even 
  135.     GURUS !!  I'll attract your attention to this when the time is right.
  136.     The DMA-members all have some 'WORKING' registers, which only are
  137.     used for internal use, so we will never use them. They are marked 
  138.     with a '0' on the list.
  139.  
  140.     While reading this part, please take the list nr 2, plus the extra
  141.     printed page marked with '!'
  142.  
  143.     Titles underlined with '-----' are register descriptions, lines with
  144.     '*****' are DMA-part descriptions. A detailed description of each
  145.     DMA-part is necescarry to understand the use of the registers.
  146.  
  147.  
  148.  
  149.     DMACON
  150.     ------
  151.  
  152.     DMACON is probably THE MOST IMPORTANT register, coz with it you can
  153.     switch the different DMA-actions (bitplane, copper...) on or off.
  154.     Look at page '!', somewhere you'll see 'DMACON $096 (R $002)'...
  155.     $096 means that this register is located at $dff000 (start of all
  156.     registers) + $096 = $dff096.   This is a write-only register. If
  157.     you wish to know the value of it, you have to look in DMACONR, the
  158.     read-only-equivalent of DMACON, and this one is at $dff002.
  159.     Don't worry about the location, this is only as an example to 
  160.     interpret the numbers. Don't go learning all registers by heart !!
  161.  
  162.     When you start a demo, first thing you have to do is tell the
  163.     computer which 'DMA-channels' you're gonna use. For example if you
  164.     not intend to use music, it's best to turn off the AUDIO-DMA.
  165.  
  166.     As told before, in some registers, each bit has aits own function,
  167.     and the DMACON is one of them. Each DMA channel has its own bit.
  168.     (see '!' page)
  169.     A possibility to turn a DMA channel on or off could be:  move a bit
  170.     1 to the channel you want to use, and a 0 to the not used channels,
  171.     but if you thought that it was that easy, you're wrong !! The DMA-
  172.     register is a bit more complex:
  173.     The DMACON uses a special bit: bit nr 15 is the set/clear-bit.
  174.     You move a word (16 bits) to DMACON, let's call this word X
  175.     (read this sentence carefully:)
  176.     If bit 15 of X is SET (1), all other bits with value 1 in X will be
  177.     SET in the register. If bit 15 of X is CLEAR (0), all bits with
  178.     value 1 in X will be CLEARED in the register. In both cases, the 
  179.     bits of X with value 0 are not considered.
  180.     Example:
  181.  
  182.          bit:1      8       0
  183.              5
  184.  
  185.     MOVE.W #%1000000001011000,$dff096
  186.         bit 6,4 and 3 will be SET in the register
  187.  
  188.     MOVE.W #%0000100110110001,$dff096
  189.         bit 11,8,7,5,4 and 0 will be CLEARED...
  190.  
  191.     On page '!' you can see a short explanation for each bit of DMACON.
  192.     bits 0 thru 8 represent each a DMA channel (disk, audio, copper...)
  193.     A 1 for these bits means this function is turned on, a 0 means not.
  194.     However, there is a special bit: bit 9 is used as MAIN SWITCH. If
  195.     this bit is zero, ALL channels are turned off no matter what their
  196.     value is. So to activate a certain DMA channel, you must turn on
  197.     both bits 9 and the bit corresponding to the DMAchannel you want.
  198.     (bits 13 & 14 aren't used to write, only to read. Bit 10 is used
  199.     rarely, 11 and 12 have no function)
  200.     Now let's give some examples:
  201.     - turn off diskDMA:
  202.         - turning off means: bit 15 is zero
  203.         - disk dma is bit 4
  204.  
  205.       so:    move.w #%0000000000010000,$dff096
  206.  
  207.     - turn on copper- and blitter DMA:
  208.         - turning on means: bit 15 is ON (1)
  209.         - copper is bit 7, blitter is bit 6
  210.         - to be sure to have the mainswitch turned on, we'll set
  211.           this bit too. (bit 9)
  212.  
  213.        so:    move.w #%1000001011000000,$dff096
  214.  
  215.  
  216.     THAT WAS A DESCRIPTION OF DMACON...  I hope not each register will
  217.     need this much explanation...
  218.  
  219.  
  220.  
  221.     COPPER
  222.     ******
  223.  
  224.     The copper is in fact a very small processor, as you saw in the
  225.     examples of last time. It can perform instructions in form of
  226.     numbers. You should see these instructions like the ones in M68000
  227.     language. The only difference is that you can write the 68000 
  228.     instructions as 'commands' (move...), and the assembler converts 
  229.     them into numbers. There could also be an assembler for the copper-
  230.     instructions, but until then, we'll just have to write the numbers
  231.     ourselves...  This is not too hard, coz a copper can only handle 2
  232.     (in fact 3, but 1 is never used) instructions. (inagine the 68000
  233.     with only 'move' and 'jmp' (also see example sources last time).
  234.  
  235.     The copper-'instructions' are put into the copper-source, mostly
  236.     called copperlist. To start the copper with executing this list,
  237.     you need certain hardware registers, namely:
  238.  
  239.     COP1LCH, COP1LCL, COPJMP1, (COP2LCH, COP2LCL, COPJMP2, COPCON)
  240.     -------  -------  -------
  241.  
  242.     The ones between brackets are for later. Now we'll only see the
  243.     3 most important ones. For the addresses please refer to the lists.
  244.     I use the names instead of the addresses, only because it is more
  245.     understandable. If you want to use one of these registers in a source
  246.     you should declare them somewhere in the souce, like:
  247.         COP1LCH=$dff080
  248.     The 'preprocessor' will then, at assembling time, replace all words
  249.     'COP1LCH' by the address $dff080. You can ofcourse also write the
  250.     address yourself, which makes it a bit harder to follow.
  251.  
  252.     COP1LCH and COP1LCL:  notice the H and L at the end of the names.
  253.      You'll see this very often in the hardwareregs. H means HIGH and
  254.      L means (obviously) LOW. Each time you'll come across such a pair
  255.      of registers, they will contain some ADDRESS. (As you know, an
  256.      address is 32 bits long = longword = 2 WORDS, that's why 2 registers
  257.      are needed)  the ...H contains the leftmost 16 bits of the address,
  258.      (the highest bits) and the ...L contains the 16 rightmost bits.
  259.     Since the ...H and ...L words are next to eachother in memory, it will
  260.     suffice to write a LONGWORD into the ...H - word, causing the highest
  261.     word of the longword to be put in the ...H word, and the lower word
  262.     into the ...L word.
  263.  
  264.     let's suppose 'copperlist:' is at $2a000
  265.  
  266.     MOVE.L #copperlist,COP1LCH
  267.  
  268.             COP1LCH  COP1LCL
  269.     $0002a000  --->     $0002    $a000
  270.  
  271.  
  272.     COPJMP1 is somewhat a special register. By moving ANY value into it,
  273.      it starts the copperlist located at the address in COP1LC L/H
  274.     These kinds of registers are called 'STROBE' registers. The fact that
  275.     there is a value written in it is enough to activate them. The value
  276.     itself doesn't matter. (clr.w copjmp1 would also be enough)
  277.  
  278.  
  279.       (    There was an explanation of the copper-instructions in one of the
  280.     sources from last time, but here's a summary:
  281.  
  282.     Each instruction is 2 words. (or 1 longword)
  283.  
  284.     The wait instruction WAITS for the electronbeam of the monitor to
  285.     reach a certain point, then it goes on with the next intruction.
  286.     A wait instruction has the following format:
  287.         dc.w    $<vvhh>,$FFFE
  288.     <vv> represent the number of the line for which to wait. <hh> is
  289.     the horizontal position, but only odd number are allowed.
  290.     ex:    dc.w    $2a0f,fffe    waits for line $2a, position $0f
  291.  
  292.     PLEASE NOTE: the screen starts (horizontally) at $0f and ends at $df
  293.     so a    dc.w    $100f,$fffe  waits for the leftmost side on line $10
  294.     and    dc.w    $10df,$fffe  waits for the rightmost side on line $10
  295.  
  296.     THE MOVE INSTRUCTION moves a value (1 WORD) into a hardware register.
  297.     Since all hardware regs have the same 'base' ($dff000), only the
  298.     offset is given in the copperinstruction, for example a $dff180 
  299.     will become $0180, $dff096 will become $0096.
  300.  
  301.     dc.w    $0180,$0fff will move the word #$0fff into datareg $dff180.
  302.  
  303.     You could ofcourse also write :        dc.l    $01800fff
  304.       )
  305.  
  306.     WARNING: Copper is the easiest DMA-member. If you think this is pure
  307.          non-sense, I advise you not to read on, coz it's NOT getting
  308.          better !!
  309.  
  310.  
  311.     BITPLANES
  312.     *********
  313.  
  314.     A bitplane is in fact a piece of memory that is made visible on the
  315.     screen. If you look at the current screen, you should see it as
  316.     a piece of memory, with the contents of this memory (the bytes) 
  317.     making up the picture on the screen. That's also why they're called
  318.     bitplanes...  A screen has a width and a height, width should be a
  319.     multiple of 16 bits. Bytes of memory are put next to eachother
  320.     on one line, until the right side of the screen is reached,
  321.     the next bytes will make up the next line of the screen and 
  322.     so on until the whole screen is filled. Already you know
  323.     how much memory a picture will use: width (bytes) * height. 
  324.     You are free to select the width (in steps of 2 bytes) and the height
  325.     of the displayed bitmap. This has several consequences: if you, 
  326.     lateron, make a picture which is 320 bits wide, 40 bytes will be 
  327.     shown next to eachother (320/8). Byte number 41 will be the first on
  328.     line 2. If you now display this same picture with a width of 336
  329.     bits (42 bytes) the picture will look very silly, because on the
  330.     first 2 bytes which should be on the second line, will now be the 
  331.     last 2 bytes on the first line, and so on...
  332.     Each pixel on a screen is related to a bit, somewhere in a byte,
  333.     somewhere in memory. If the bit is set, the pixel is 'lit'. If the
  334.     bit is not set, the pixel is 'dark'. Now you see: in one bit you
  335.     can't put much information, especially when you got 4096 colors to
  336.     choose from, 1 bit isn't enough to tell exactly in what color you 
  337.     want to display this pixel. That's why we can put more planes on
  338.     top of eachother. See page '1' in the copies.  If you put 2 planes
  339.     on top of eachother, a pixel of the 1st plane can be on or off, same
  340.     for a pixel on plane 2. This way you can create 4 combinations:
  341.     0&0, 1&0, 0&1, 1&1.  The number of combinations is always 2^x, with
  342.     x the number of planes you use.  For 8 colors you'll need 3 planes,
  343.     (2^3 = 8) Now to get 4096 combinations, you would need 12 bitplanes...
  344.     This is ofcourse a bit too much for 512 Kram of memory. That's why
  345.     there is the pallette. In it, you can define 32 colors, which you can
  346.     choose from the available 4096 colors.
  347.     You need 5 bits to make 32 combinations, which means to display 32
  348.     colored pictures, you need 5 planes. (see pages '1')
  349.  
  350.     There are different resolutions. Amiga 500 has 4 resolutions:
  351.     320 bits per line or 640 bits per line, and 256 or 512 lines.
  352.     The lowest resolution is 320 x 256 (LO-RES), 640x256 is called
  353.     MED-RES or WORKBENCH, the '512 lines' resolutions are called 
  354.     INTERLACED,(this is a term from the TV-world) Because of some reasons,
  355.     the screen flickers when amiga displays 512 lines. In fact he first
  356.     displays the odd lines, then the even ones. 640x512 is the highest 
  357.     possible resolution. In this mode, only 16 colors are possible because
  358.     the AMIGA is not fast enough to fill the whole screen in time with
  359.     more colors. (I got sum lists with needed cycles per plane and per
  360.     resolution, but they're boring - ask if you'ld want to know anyway)
  361.     Now I told almost everything about the basic bitplanes. There's some
  362.     more to tell but let's first show you the registers that can be
  363.     addressed to 'set up' bitplanes:
  364.  
  365.     1)  BPL1PTH & BPL1PTL
  366.     2)  BPL2PTH & BPL2PTL
  367.         ...
  368.     6)  BPL6PTH & BPL6PTL
  369.     7)  BPLCON0
  370.     8)  BPLCON1
  371.     9)  BPLCON2
  372.     10) DDFSTART/DDFSTOP
  373.     11) DIWSTART/DIWSTOP
  374.     12) BPL1MOD/BPL2MOD
  375.     13) COLOR00 -> COLOR32
  376.  
  377.     This is ofcourse quite a bit. You can do lots of things with these
  378.     bitplanes, and therefore, all these registers are needed.
  379.  
  380.    1-6)    The first 6 pairs contains the startaddresses of the 6 possible 
  381.     bitplanes. (In normal mode, only 5 are possible, but later you'll
  382.     see that special modes (like HAM, EHB and DUAL PLAYFIELD) can use
  383.     6 planes)
  384.     If you have loaded a picture into memory at location 'pic:', you must
  385.     tell that to the grafixchips by giving them the address of the first
  386.     byte in this picture. Again there are 2 registers, because an address
  387.     is 2 words long, and a register is only 1 word long.
  388.     If you have more than one bitplane, you must also write the startaddress
  389.     of the other planes in the according registers.
  390.  
  391.     IMPORTANT:
  392.  
  393.     It is usual that the bitplane-registers are put in the copperlist
  394.     because in nearly each demo, more bitplanes are used on 1 screen,
  395.     just like the example-demo on the disk. The top part of the screen
  396.     is a picture in lo-res, and the bottom part is another picture with
  397.     the scroller (located somewhere else in memory, so other bitplane-
  398.     addresses will be needed). This is a typical problem for the copper:
  399.     you tell him to put the picture starting from line 30 (for example) 
  400.     and the scroll starting at line 200.
  401.     This brings us to a rather large problem: in the previous examples
  402.     we MOVED the whole address of the copperlist to the 2 registers 
  403.     containing the high and low word of the address:
  404.         MOVE.L #label,$REG-HIGH
  405.     At the assembling of this source, the computer would assign an address
  406.     to 'label' and 'replace' the TEXT 'label' with this address, so it
  407.     would in fact look like this:
  408.         MOVE.L #$32a14,$REG-HIGH
  409.     This would result in REG-HIGH containing the highword of the address
  410.     ($0003) and REG-LOW containing the low word.($2a14)
  411.     IN the copperlist, this address is torn in 2 pieces:
  412.         DC.W    $REG-HIGH,$0003,$REG-LOW,$2a14
  413.                     ^^           ^^
  414.     But since we aren't allowed to use fix addresses, we can't write our
  415.     programs like this last example...  ALWAYS USE LABELS !!
  416.     How do we tell the copperlist what the lowword and the highword is
  417.     of our label, if we don't know it ourself ??
  418.     Well, there is only one way around this problem, and that is the
  419.     following:  before we start with the real demo, we put a routine 
  420.     that calculates the 'highwords and lowwords' that we will use in
  421.     the copperlist. At this moment, the computer already assigned 
  422.     addresses to the labels, and so HE knows them. Now let's give a 
  423.     detailed example:
  424.  
  425.     - We have a picture, it starts at label 'pic:'
  426.     - In our copperlist, we will need a line with the registers
  427.       BPL1PTH and BPL1PTL (we will only use 1 plane now)
  428.       this line will look like this:
  429.         dc.w $00e0,<HHHH>,$00e2,<LLLL>
  430.       $00e0 and $00e2 are the BPL1PT registers (see list)
  431.       HHHH is the highword of the address assigned to 'pic:' and LLLL is
  432.       the lowword. Again: WE DON'T KNOW THE ADDRESS OF 'PIC:' until the
  433.       program is running !!
  434.     THIS IS HOW WE DO IT:
  435.  
  436.     start:    move.l    #pic,d0            ;1
  437.         move.w    d0,lowword        ;2
  438.         swap    d0            ;3
  439.         move.w    d0,highword        ;4
  440.         ....
  441.  
  442.     ;----------------------
  443.  
  444.     pic:    blk.b    picsize,0
  445.  
  446.     copperlist:    ....
  447.             dc.w    $00e0
  448.       highword:    dc.w    $0000        ;5
  449.             dc.w    $00e2
  450.       lowword:    dc.w    $0000        ;6
  451.             ....
  452.  
  453.     Explanation: in line 1 we move the address of the picture (which
  454.     at the moment of execution is known by the computer) to a data-
  455.     register.(Notice that we moved a LONGWORD, because it is and address)
  456.     Line 2 moves the LOWEST WORD of the dataregister to the label 
  457.     'LOWWORD'. At this label, we reserved 1 word to put this value in.
  458.     (line 6). The next instruction (line 3) is SWAP Dx. This instruction
  459.     switches the words from a dataregister, so that the highword now
  460.     becomes lowword and vice versa. If we then again do a move.w, the
  461.     word that we move is in fact the HIGHWORD of the address. That should
  462.     be clear enough ?? Examine this example until you get it !! It is 
  463.     indispendable because we will use it very often !! If you understand it
  464.     completely, we could try the same program written in a bit different
  465.     way:
  466.  
  467.         lea.l    plane,a0
  468.         move.l    #pic,d0
  469.         move.w    d0,6(a0)
  470.         swap    d0
  471.         move.w    d0,2(a0)
  472.         ....
  473.  
  474.     copperlist:
  475.         ....
  476.     plane:    dc.w    $00e0,$0000,$00e2,$0000
  477.  
  478.     The results of this source are completely the same. Try to find out
  479.     how it's done in this case !
  480.  
  481.  
  482.  
  483.     If you use a second plane, the startaddress of this one would be
  484.     put in BPL2PTH and -L. The planes are usually right after eachother
  485.     in memory. If again, the first plane starts at 'pic:', how do you 
  486.     calculate the start of the second plane ?  In fact it is easy: you
  487.     take the width of the picture, let's say it's 320 bits, equal to 40
  488.     BYTES. If your piccy is 256 lines high, the total amount of bytes in
  489.     ONE plane is 40 x 256, is 10240 bytes. In hexadecimal notation, 
  490.     this is #$2800. The start of the second plane would be 'pic:'+$2800
  491.     The third plane 'pic:'+ 2*$2800 and so on...
  492.  
  493.         lea.l    plane,a0
  494.         move.l    #pic,d0            ; 1st plane
  495.         move.w    d0,6(a0)        ;
  496.         swap    d0            ;
  497.         move.w    d0,2(a0)        ;
  498.  
  499.         move.l    #pic+$2800,d0        ; 2nd plane
  500.         move.w    d0,14(a0)        ;
  501.         swap    d0            ;
  502.         move.w    d0,10(a0)        ;
  503.  
  504.         ...                ; and so on
  505.  
  506.     You should take special care of the offsets: the 14 before the (a0)
  507.     means that the moved word will be put 14 bytes behind the label 
  508.     'plane:'  
  509.  
  510.     plane:    dc.w    $00e0,$0000        ; plane 1, high word
  511.         dc.w    $00e2,$0000        ; plane 1, low word
  512.  
  513.         dc.w    $00e4,$0000        ; plane 2, high word
  514.         dc.w    $00e6,$0000        ; plane 2, low word
  515.  
  516.     After assembling, memory looks this way: (in seka: qplane)
  517.  
  518.     mem.cont's:  00 e0  00 00  00 e2  00 00  00 e4  00 00  00 e6  00 00
  519.     offset:      0  1 / 2  3 / 4  5 / 6  7 / 8  9 / 10 11 /12 13 /14 15
  520.  
  521.     As you see: at 14(a0) is $0000, it's the place we reserved to put
  522.     the low word of the second plane. If you are not sure of what ofset
  523.     you will have to take, just count as in this example. If you take a
  524.     wrong offset (for example 12) you would overwrite another part of
  525.     the copperlist, which could have strange effects. (like flashing
  526.     red bars)
  527.  
  528.  
  529.  
  530.      7)    BPLCON0
  531.     -------
  532.     This is the main 'control'-register for the bitplanes. In it you
  533.     can say how many bitplanes you're gonna use, and what resolution.
  534.     Other things like HAM, EHB and DPF are also declared here, but that's
  535.     for later. If you want to use 5 planes, you must put this value in
  536.     bits 14 to 12 of BPLCON0. 5 planes is binary #%101, so the BPLCON0
  537.     would look like this:
  538.  
  539.      #%0101000000000000    ; 5 planes activated.
  540.         ^ ^          ^
  541.        14 12          0  <- bitnumber
  542.  
  543.     A consequence of declaring 5 planes in CON0 is that you have to 
  544.     write addresses in BPL1PTH/L, BPL2PTH/L until BPL5PTH/L.
  545.  
  546.     Other bits in this register are explained on the !-page...
  547.     If you want to turn on hires (640 wide), set the 15th bit.
  548.      "  "    "   "   "   " interlace (512 lines) set the 2nd bit etc...
  549.     Bits 0 and 4 to 7 have no function. You'll probably never use 1,3,8
  550.     9 and 10. (I never did)
  551.  
  552.    8-9)    In BPLCON1 and BPLCON2 you can declare some more things for your
  553.     bitplanes, they will be discussed later.
  554.  
  555.     10)    DDFSTART and DDFSTOP are used to change the width of the picture.
  556.     As said, you can change the width in steps of 2 bytes. You do this
  557.     by moving certain values in DDFSTART and -STOP. (DDF means: DISPLAY
  558.     DATA FETCHT). These values are somewhat unlogical to me. There are
  559.     sophisticated formulas to calculate the DFFSTART and STOP values, 
  560.     but just remember this: DFFSTART is the left side of the screen.
  561.     It should at least be #$28. If you use sprites (later) this value
  562.     must be at least #$38 (because of internal timing, I'll tell you more
  563.     later) DDFSTOP should be maximum #$d8. Change DDFSTART/STOP only in
  564.     steps of #$8. (#$28, #$30, #$38... #$c0,#$c8,#$d0,#$d8) 
  565.       -    FOR A NORMAL SCREEN (320 wide), DDFSTART is #$38 and DDFSTOP is #$d0
  566.     see page '!'
  567.  
  568.     11)    DIWSTART and DIWSTOP are used to 'hide' the outer parts of the
  569.     screen. Using these registers it's possible to make a screen of
  570.     for example 321 bits wide (no multiple of 2 bytes). In fact this
  571.     is only fake, the screen still is a multiple of 2 bytes wide, but
  572.     you hide a part of it. Same thing is for vertical 'hiding'.
  573.     I never use these registers, but it's best to declare them in your
  574.     demos (other programs could have changed them). Just put the values
  575.     in them which are on the '!' page. With these values, the complete
  576.     screen is visible (no hidden parts)
  577.  
  578.     12)    Modulo is a special feature of Amiga (and probably other graphical
  579.     miracles). This is not only used in Bitplane but you'll encounter it
  580.     later again when we're at the BLITTER. Now what is MODULO ?
  581.     If you have a picture which is 320 bits wide, it's perfectly possible
  582.     to show it on screen: one screen can easily display 40 bytes next to
  583.     eachother. It's ofcourse harder to display 1000 bytes on 1 row, but
  584.     that's where the modulo enters the scene. Theoretically spoken, if 
  585.     Amiga builds a screen, consequent bytes from memory are put next to
  586.     eachother until the line is filled (DDFSTART/STOP values define the
  587.     number of bytes on a row). Then the modulo-value is added to the
  588.     address, and then the next line is filled with the following bytes.
  589.     An example: if the modulo is '2', and your screen is 40 bytes wide,
  590.     there will be 40 bytes from memory next to eachother on line one,
  591.     then 2 bytes will be skipped, and the next 40 bytes wil fill up 
  592.     line 2, again 2 bytes are skipped, etc... this way you are able to
  593.     display a (part of) picture of ANY width (in steps of 2 bytes) even
  594.     if it's 10000 bytes wide. An example might help:
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.     Now you might ask: why are there 2 modulo registers ? Good question
  603.     It has to do with the 'dual playfield modus' which you also find in
  604.     BPLCON0. With this mode you can define 2 completely independent
  605.     screens, with both maximum 3 planes. That's why there are 6 planes
  606.     available, and that's also why you have 2 modulo registers. If you 
  607.     don't use Dual playfield, just put the same value in both registers.
  608.  
  609.     13)    Finally, the easiest part: colors. As said before, you can define a
  610.     pallette containing 32 colors out of the possible 4096 colors
  611.     (confer DPaint,...) The values of these colors are put into the
  612.     registers COLOR00 until COLOR31. See also page '1' in the listings.
  613.     You don't have to know more about this if you make your pictures 
  614.     with Dpaint, but it might be interesting to know how the colors are
  615.     related to the patterns of bits in the planes:
  616.     if the on-top-of-eachother-laying bits of the different planes are
  617.     all 0, COLOR00 will be visible. A completely 'empty' picture will
  618.     therefore always be displayed in this color. If only the bit of 
  619.     plane 1 is set, this dot will be in COLOR01...  Don't worry, because
  620.     Dpaint will worry for you...  Later we will see how to import a 
  621.     DPAINT picture into your own demos, with colors and everything !!
  622.  
  623.     FINALLY
  624.     -------
  625.     To get a better view of all this bitplane stuff, I advise you to
  626.     experiment with the Graphicsearcher, which is on the 'CODER-TOOLS'
  627.     the disk I sent last time. Pressing 1 to 5 will start/hold one of
  628.     the 5 planes. By moving planes on top of eachother (cursor keys)
  629.     you might be able to reconstruct a picture that could still be 
  630.     somewhere in memory (=ripping) press [ and ] to change DDFSTOP. 
  631.     Press . and / to change the MODULO. Press + and - to change the
  632.     number of planes in the picture. Press F10 to exit.
  633.  
  634.  
  635.     HOW TO IMPORT DELUXE PAINT PICTURES INTO YOUR OWN DEMOS
  636.     -------------------------------------------------------
  637.     Delucepaint saves it's pictures in the IFF-format. This is nice coz
  638.     most other programs can use these format too. In this format are 
  639.     much information about the picture: the size, the # of colors, the
  640.     'cycling' of the colros and more stuff. Also, IFF pictures are
  641.     CRUNCHED (packed) to gain some diskspace. We don't need most of this
  642.     and it would cause too much programming to DECRUNCH the pictures, so 
  643.     we will always CONVERT iff-pictures into RAW pictures. On the disk 
  644.     is an IFF-CONVERTER, which does this for us.  It will write a file
  645.     which contains only the bytes belonging to the picture (shape) and
  646.     if you desire, some extra words containing the color-values.
  647.     You simply LOAD the IFF picture with the 'load' gadget. Then you set
  648.     the gadget to RAW-NORM and SAVE. (don't forget to change the name if
  649.     you want to keep the IFF picture)
  650.     You can include the colors in this RAW picture, in 2 different ways:
  651.     BEFORE or BEHIND. BEFORE will first write the colors (# of colors *
  652.     2 bytes) (5 planes = 64 bytes extra) and THEN save the picture data,
  653.     BEHIND wil append the colors BEHIND the picture data. See example
  654.     in the demo. When doing this kind of conversion, you should remeber
  655.     somehow what the size of your picture is, I mostly put the size in
  656.     the name, like this: logo.40x100x3 which means 40 bytes wide, 100
  657.     lines high, 3 planes. The amount of bytes you must reserve for this
  658.     picture (if you included the colors BEFORE) is:
  659.  
  660.     40 * 100 * 3     (picture data)
  661.     2^depth        (# col (words))
  662.  
  663.     so in a source we'ld get something like this:
  664.  
  665.     WIDTH=        40    ; bytes
  666.     HEIGHT=        100    ; lines
  667.     DEPTH=        3
  668.     PICSIZE=    WIDTH * HEIGHT * DEPTH
  669.     NUMOFCOL=    2^DEPTH    ; words !!
  670.  
  671.     colors:    blk.w    NUMOFCOL
  672.     pic:    blk.b    PICSIZE
  673.  
  674.     >extern "picname",colors
  675.  
  676.     ( or for 'RAW/BEHIND':
  677.  
  678.       pic:        blk.b    PICSIZE
  679.       colors:    blk.w    NUMOFCOL
  680.  
  681.       >extern "picname",pic
  682.     )
  683.  
  684.  
  685.     SPRITES
  686.     *******
  687.  
  688.     Sprites are nice because they don't need much programming, and 
  689.     they're pretty fast, but there are several limitations to them too.
  690.     I don't use them often, only for some boring stars, or for mouse-
  691.     pointer (which is a sprite too!)
  692.     The most important limitation is that a sprite can only be 1 word
  693.     wide. That's really a bad thing. Also you can only make sprites 
  694.     with 8 colors (normally only 4, but there's a special mode to 
  695.     combine 2 sprites into 1, see later)
  696.     I guess you already knew what a sprite is: a graphical object,
  697.     some kind of mini-bitplane, which can be moved across the normal
  698.     bitplane (the screen). Look at the mousepointer to see an example.
  699.     Sprites, like normal bitplanes, have more planes to select the
  700.     several colors. Since a sprite can (under normal circomstances)
  701.     have 4 colors, 2 planes are needed (see bitplane explanation) 
  702.     But where bitplane-planes were beneath eachother (first the first
  703.     plane, then the second and so on...), sprites-bitplanes are different:
  704.     first a word of the 1st plane, then a word of the second, then again
  705.     one of the 1st plane... Since a sprite is only one word wide, this
  706.     is no big deal to code: this is a normal way of drawing a sprite:
  707.  
  708.     dc.w    %0000000000000000,%1111111111111111
  709.     dc.w    %0000000000000000,%1000000000000001
  710.     dc.w    %0000110000110000,%1000000000000001
  711.     dc.w    %0000110000110000,%1000100000010001
  712.     dc.w    %0010000000000100,%1000000110000001
  713.     dc.w    %0001100000011000,%1000000000000001
  714.     dc.w    %0000011111100000,%1000000000000001
  715.     dc.w    %0000000000000000,%1111111111111111
  716.             ....        ....
  717.             ^^            ^^
  718.         data of 1st plane     data of 2nd plane
  719.  
  720.     The sprites have no own palette (see bitplanes) but they
  721.     use the color register 'color16' to 'color31'.
  722.  
  723.     spritenumber    1st 2nd plane   displayed color
  724.  
  725.        0 & 1     0   0        color00 (transparant)
  726.              1   0        color17
  727.              0   1        color18
  728.              1   1        color19
  729.        2 & 3     0   0        color00 (transparant)
  730.              1   0        color21
  731.              0   1        color22
  732.              1   1        color23
  733.        4 & 5     0   0        color00 (transparant)
  734.              1   0        color25
  735.              0   1        color26
  736.              1   1        color27
  737.        6 & 7     0   0        color00 (transparant)
  738.              1   0        color29
  739.              0   1        color30
  740.              1   1        color31
  741.  
  742.     When you turned on Bitplane-DMA (in the DMACON (see earlier)) you
  743.     had to decalre the BPLxPTH & BPLxPTL, for each plane you used.
  744.     Same thing counts for sprites: If you use them, you must tell where
  745.     the data for the sprites is in memory, using similar registers as
  746.     BPLxPTH/L:  SPRxPTH/L !!
  747.  
  748.     SPR0PTH & SPR0PTL contain the address of the sprite0-data.
  749.       ...         ...
  750.     SPR7PTH & SPR7PTL contain the address of the data for the last sprite.
  751.  
  752.     However: you must fill in ALL these registers, even if you only use
  753.     1 sprite.
  754.  
  755.     The sprite data does not only contain the shape of the 'mini bitplanes'
  756.     but also the position on the screen and the height of the sprite:
  757.     This is how the complete sprite-structure looks like:
  758.  
  759.     dc.w    xxxx,yyyy
  760.     dc.w    %00000000,%00000000        ; the shape of the 2 planes
  761.     dc.w    %00000000,%00000000        ; can be anything
  762.            ....          ...
  763.     dc.l    0                ; longword zero to end
  764.  
  765.     the first 2 words are the 'controlling words' they control the
  766.     position and the height. 
  767.     There are 9 bits to declare the horizontal & vertical position of
  768.     a sprite. These bits are a bit strangely spread over the 2 words
  769.     xxxx and yyyy:
  770.  
  771.     xxxx: bit:  15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
  772.     meaning:    V7 V6 V5 V4 V3 V2 V1 V0 H8 H7 H6 H5 H4 H3 H2 H1
  773.  
  774.     yyyy: bit:  15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
  775.     meaning:    L7 L6 L5 L4 L3 L2 L1 L0 AT 0  0  0  0  V8 L8 H0
  776.  
  777.     V8-V0:    9 bits for the vertical start position (1st line)
  778.     H8-H0:  9 bits for the horizontal position.
  779.     L8-L0:  9 bits for the vertical end position (last line)
  780.     AT:    attach-bit (if this is set, 2 sprites are combined into 1
  781.         giving 8 possible colors. Sprites combined as: 0&1, 2&3...)
  782.  
  783.     V8,L8 & H0 are separated from the rest of their bits, and this 
  784.     causes some extra programming: if the sprite is over line 256,
  785.     the V8-bit is set, bit H0 will change each time you move it 1 pixel
  786.     to left or right, V8 will be 1 when the sprite is over line
  787.     256-length.
  788.  
  789.     So now the computer has the vertical startposition of the sprite.
  790.     When the electronbeam of the monitor reaches this line, the computer
  791.     will take a word from the data and put it on screen, then going to
  792.     the next line and so on, until the last line (L-bits) is reached.
  793.     If the next 2 data words are both ZERO, the DMA-channel for this
  794.     sprite is turned off, so the cpu can start doing something else.
  795.     If they are NOT zero, the story starts all over: the next 2 words
  796.     will be controlling words which contain another position, and then
  797.     another part of datawords will follow, until the last 2 words are
  798.     zero:
  799.  
  800.     dc.w    $10xx,$12yy            ; vstart=$10,vend=$12
  801.                         ; (2 lines high)
  802.     dc.w    %00000000,%00000000        ; 2 lines of data
  803.     dc.w    %00000000,%00000000        ; (can be anything)
  804.     dc.w    $13xx,$15yy            ; not zero -> new sprite
  805.     dc.w    %00000000,%00000000        ; again some datalines
  806.     dc.w    %00000000,%00000000        ; (can be anything)
  807.     dc.l    0                ; longword zero to end
  808.  
  809.     This way you can put more sprites on screen with in fact only
  810.     one sprite. The only thing that is necessary is that the vertical
  811.     position of the next sprite must always be 1 more than the end-
  812.     line of the previous one, (to give the CPU time to read the 2 
  813.     controlling words), so in the example sprite 1b starts at $13 where
  814.     sprite 1a ended at $12. (I say sprite 1a and 1b and not 1 and 2, coz
  815.     in fact they are only 1 sprite)
  816.     This very neat feature of sprites is often used to create starfields
  817.     in demos etc. What you see is only 1 sprite, with more controlling
  818.     words. Note that between each star will be one empty line, because
  819.     of reasons explained here. Using some copperinstructions (wait for
  820.     certain line and change spritecolor) you can give a different color
  821.     to each 'subsprite' and by changing the horizontal position each 
  822.     time, you can smoothly scroll each star with it's own speed, creating
  823.     a nice eefect of depth. (see demonstration on disk)
  824.  
  825.     Sprites are also often used for mousepointers. By reading 2 registers
  826.     in memory (see soon) you can calculate the position of the mouse-
  827.     pointer, and calculate the appropriate values for the controlling-
  828.     words in the sprite-data. This is somewhat more difficult because the
  829.     bits of the horizontal and vertical position are strangely spread,
  830.     but there's an example of a mouse-routine on the disk. Here you will
  831.     see how to calculate the bits depending on the position of the
  832.     mouse.
  833.  
  834.     MOUSE & JOYSTICK
  835.     ****************
  836.     Mouse: JOY0DAT ($dff00a)
  837.     Joyst: JOY1DAT ($dff00c)
  838.            -------
  839.  
  840.     bit:  15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
  841.           Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 X7 X6 X5 X4 X3 X2 X1 X0
  842.  
  843.     first byte (Y7-Y0): vertical movement (delta Y)
  844.     secnd byte (X7-X0): horizontal movement (delta X)
  845.  
  846.     As said, there's an example on disk. Please check out this to get
  847.     the picture. Don't worry if you don't get it, you won't need it
  848.     often I suppose.
  849.  
  850.     The next thing however will be in nearly each program you'll write:
  851.  
  852.  
  853.  
  854.     BLITTER !!! (yeah the famous one who writes 1.000.000 data per second)
  855.     ***********
  856.  
  857.     The blitter is one hell of a miniprocessor, which can be used to
  858.     copy memory, or to draw lines, at VVEEEERRRY rapid speeds.  I can
  859.     however at this point tell you that speed is very relative, and
  860.     once you're making serious demos, this VEEERYY rapid speed will soon
  861.     turn out to be not so fast at all, but remember: it's no wizardry,
  862.     it's only a chip !!
  863.     How does the blitter work:  via some registers you first tell him
  864.     some details about what you're gonna do: whether you're gonna draw
  865.     lines or copy memory, which modulo etc, (see later)  Finally you
  866.     tell him the size of the whole thing and by doing this you activate
  867.     him. He starts copying or drawing a line. The nice thing is that you
  868.     don't have to wait until he's ready: the CPU can go on with other
  869.     instructions. However, before you can start another blitter-task,
  870.     you must be sure to finish the last one, and this is done by checking
  871.     the 14th bit in DMACON (see page '!' - blitter busy) when this bit
  872.     is set, the blitter is still busy, so the subroutine 'WAITBLITTER:'
  873.     will look like this:
  874.  
  875.         waitblitter:
  876.             btst    #14,$dff002
  877.             bne.s    waitblitter
  878.             rts
  879.  
  880.     Now about the blitter: the drawing of lines is quite difficult, I
  881.     only tried it once, and I have to admit: I copied the routine from
  882.     a book and I didn't get all of it, so don't ask me to explain it.
  883.     Instead I'll try to make clear the copying abilities of the blitter,
  884.     which won't look to simple neither at the beginning... I'll put the
  885.     drawline routine somewhere on the disk if I still have it...
  886.     First: Blitter can combine several inputs into one output. You can
  887.     specify 3 sources and one destination. You can turn each one on or
  888.     off.
  889.     Second: (and this is a touch one!) did you ever hear of BOOLEAN 
  890.     MATHEMATICS ?? If so, that would be nice, but in case you didn't,
  891.     here is some brief explanation:  We count with 2 numbers (you guessed
  892.     right) 0 and 1. 0 means 'NOT TRUE' (or NOT SET) and 1 means 'TRUE'
  893.     (OR SET). We have 3 operations: AND, OR and NOT.  X OR Y = Z (try
  894.     putting it in words, and it becomes 'normal': if X is TRUE, OR Y is 
  895.     TRUE, then Z is TRUE. X AND Y = Z: X AND Y have to be true to make Z
  896.     true.If a or b is not true, c will be false too. NOT A = B: If A is 
  897.     true, B will be false and vice versa. You can also make combinations:
  898.     (NOT A) AND (B OR C) = D
  899.     (A OR (NOT B)) AND (C AND (B OR (NOT(A OR B)))....
  900.     After a few hours of theory, you'll find out that each of these 
  901.     functions can be written in a number of 'MINITERMS', which only use
  902.     the AND operation. These miniterms make the functions 'easier'.
  903.  
  904.     With A,B and C and the AND function, we can make lotsa combinations:
  905.     A true AND B not true, and C true, and so on...  You can by now tell
  906.     me how many combinations there are using 3 of these 'bits' ? yes: 8 !
  907.     In other words: With 3 bits, we can make 8 miniterms:
  908.  
  909.         A    B    C        ABC
  910.         ---------------------        ---
  911.         set    set    set        111
  912.         set    set    not set        110
  913.         set    not set    set        101
  914.         set    not set    not set        100
  915.         not set    set    set        011
  916.         not set    set    not set        010
  917.         not set    not set    set        001
  918.         not set    not set    not set        000
  919.  
  920.     Now to come back at the blitter: A,B and C are parts of memory, 
  921.     where bits can be SET or NOT SET. The destination is D. Memory from
  922.     locations at A,B and C will be combined into a piece of memory at
  923.     location D, using sets of combinations: the miniterms.
  924.     In register BLTCON are 8 bits who represent each a miniterm of the
  925.     list above. If one of them bits is set, the destination bit will be
  926.     set if that particular combination is achieved in the sources.
  927.     Let's give an example, first an easy one:
  928.     if you want to copy memory from location A to location D, you just
  929.     say: if A is set, then D is set !! If A is not set, D isn't set
  930.     neither. B and C aren't used in this case, so their value (set or
  931.     not set) aren't important.
  932.  
  933.     D is 1 'IF A=1'
  934.  
  935.     D is 1 when  A=1 AND B=1 AND C=1
  936.         or   A=1 AND B=1 AND C=0
  937.         or   A=1 AND B=0 AND C=1
  938.         or   A=1 AND B=0 AND C=0
  939.  
  940.     The miniterms in this case will be:
  941.     (111)    (110)    (101)    and    (100)    
  942.  
  943.     And yes: in each case, A is set !! (ain't that fascinating ?)
  944.  
  945.     Please try this example:
  946.     which combinations are needed when you wish to put a pixel at each
  947.     place where the B-bit is not set and the A bit is equal to the C bit ?
  948.     You should find the following:
  949.         B bit is not set -> only these combinations remain:
  950.             101,100,001,000
  951.         A = C so we get the result:
  952.             101 and 000
  953.     Or this (and this combination is often used when making BOBS - see
  954.     later ?):
  955.     You want to set the destination when A is set, OR when B is set but
  956.     C is not set. "A OR (B AND NOT C)"
  957.     This is true whenever the A bit is set, so: 111,110,101,100
  958.     And also when B is set while C is not set : 110,010
  959.     (110 happens to occurs twice, but that's no problem, just use'm once)
  960.     Together we'll have to set the miniterms: 111,110,101,100,and 010
  961.  
  962.     As you see you can make quite complex comparisions using this in fact
  963.     simple (even prehistorical) boolean-stuff. It is because it is 
  964.     so simple that it is so fast. No speed is lost by doing these calculations
  965.     Imagine what time it would take if you had to write a program to do
  966.     the same for EACH BIT !! Blitter can put about one million bits per 
  967.     second !!
  968.  
  969.     BLTxPT
  970.     ------
  971.     As in the bitplanes and sprites, here too you must tell the start-
  972.     addresses of both Sources (A B and C) and Destination memory (D).
  973.     Each have their own pair of registers: (see list for values)
  974.      BLTAPTH & BLTAPTL
  975.      BLTBPTH & BLTBPTL
  976.      BLTCPTH & BLTCPTL
  977.      BLTDPTH & BLTDPTL
  978.     One problem: Blitter can only work with WORDS, so each of these
  979.     addresses must have an even value (but if you gave an odd one, 
  980.     he'ld adjust it himself)
  981.  
  982.     BLTSIZE
  983.     -------
  984.     This register has 2 functions. As the name says, it contains the
  985.     size of the blitted (copied) part of memory. This size has a height
  986.     and a width. (Now when reading the next bit, it would be nice if you
  987.     understood the bitplane-stuff, like how a screen is built up and
  988.     why exactly MODULO is used)  For example you want to copy a part from
  989.     a 40 bytes wide screen, onto another screen of 42 bytes wide. Let's
  990.     say the image you're gonna copy is 4 words (only count in words when
  991.     using blitter) wide and 20 lines high. The WIDTH AND HEIGHT of the
  992.     copied part will be put in the BLTSIZE-register. There are 10 bits
  993.     for the height, and 6 bits for the width:
  994.         %hhhhhhhhhhwwwwww    (16 bits = 1 word = size of register)
  995.     This could be a way of calculating the correct bltsize for our example:
  996.         clr.l    d0
  997.         move.w    #20,d0        ; (height)
  998.         asl.w    #6,d0        ; shift left by 6 bits
  999.         or.w    #4,d0        ; (width expressed in words)
  1000.  
  1001.     20 is %0000010100,  4 is %000100, so d0 will look like this:
  1002.  
  1003.         %0000010100000100
  1004.          ----------......
  1005.             20        4
  1006.  
  1007.     Another way of calculating the BLTSIZE is: height*64 + width
  1008.     %0100 * 2 = %1000, you see that multiplying by 2 is the same as
  1009.     shifting 1 to the left. Shifting 6 to left is the same as multi-
  1010.     plying by 64 (2^6). ASL is however much faster than MULU.
  1011.     If your blitsize is constant, you could do this calculation BEFORE
  1012.     the program, like this:
  1013.     declaration_of_constants:
  1014.         BLITSIZE=HEIGHT*64+WIDTH
  1015.         .... 
  1016.     program:
  1017.         ...
  1018.         move.w    BLITSIZE,$dff058    ; dff058=register for blitsize
  1019.  
  1020.     Please note that you must calculate this value BEFORE you put it in
  1021.     the BLTSIZE, coz when you put ANYTHING in the register, the blitter
  1022.     will start. So we HAD to do the calculations in for example D0, and
  1023.     THAN put d0 in BLTSIZE.  This would not work:
  1024.         Move.w #20,$dff058
  1025.         asl.w  #6,$dff058
  1026.         .....
  1027.  
  1028.     A write in BLTSIZE is the LAST THING you can do.
  1029.  
  1030.     BLTxMOD
  1031.     -------
  1032.     Remember the object to be copied was 4 words wide, but it was on a
  1033.     picture of 40 bytes wide. That's where the MODULO shows up again !
  1034.     Imagine the blitter. First he reads the startaddress of our image,
  1035.     in BLTAPTH/L. That is the left side of the image. He starts copying
  1036.     words, one after another, going from left to right until it has 
  1037.     copied 4 words and thus reached the right side. Then he will skip some
  1038.     bytes until he has again reached the left side of the image and then
  1039.     he'll again copy 4 words... and so on until he has copied 20 lines.
  1040.     The amount of bytes to be skipped when going from one line to another,
  1041.     is called the MODULO (see also bitplanes). Bitplanes have a modulo
  1042.     to display a picture that is wider that the monitor, blitter uses
  1043.     a modulo to copy images that are not as wide as the displayed screen.
  1044.     Blitter has a modulo for each channle A,B,C and D. This makes it
  1045.     possible to copy an image for example from a small screen onto a wide
  1046.     screen. The modulos that the blitter uses are called BLTAMOD, BLTBMOD,
  1047.     BLTCMOD and BLTDMOD.
  1048.     Now let's calculate the value for our example. The source screen was
  1049.     40 bytes wide, while our object was only 4 words (=8 bytes) wide.
  1050.     After copying 8 bytes, there will be 32 bytes left to be skipped,
  1051.     so the source-modulo will be 32 !! (yes indeed, this is the amount
  1052.     of BYTES and NOT the amount of WORDS, don't ask me why)
  1053.     The destination screen was 42 bytes wide, so after copying 4 words
  1054.     onto this screen, 34 bytes will be left to skip. BLTDMOD = 34.
  1055.     (move.w    #34,BLTDMOD)
  1056.  
  1057.     BLTCON0 (cont'd)
  1058.     -------
  1059.     As said, the miniterm are represented by bits in the BLTCON0.
  1060.     There's more to be found in this register: the USE bits, with which
  1061.     you can select which 'channels' you're gonna use: if you use only
  1062.     one source and the destination (D) you only turn on A and D.
  1063.     (the less channels you use, the faster is goes!)
  1064.  
  1065.     The highest 4 bits are called the BARRELSHIFTER. If for example you
  1066.     put value '5' in this register, (0101) the incoming image will be
  1067.     shifted 5 bits to the right (or left, I'm not sure). This is used
  1068.     to smoothly scroll an image, remember you could only work in steps
  1069.     of a word when using blitter !   See examples in the little demo...
  1070.  
  1071.     BLTCON1
  1072.     -------
  1073.     The highest 4 bits are again used as barrelshifter, but this time
  1074.     for source B. Not often used, only for bobs I think. (by the way
  1075.     bobs are pretty complicated) bits 4,3,2 and 0 are used for lines
  1076.     only. Bit 1 is the 'DESCENDING' bit. If the DESTINATION is partly
  1077.     overlapping the source, like in this small illustration:
  1078.  
  1079.  
  1080.  
  1081.  
  1082.     by writing the first values onto the destination, the source will
  1083.     be overwritten. The solution is starting at the end. If this situation
  1084.     should occur, you must set the DESCENDING bit, and you must also
  1085.     give the END addresses of the sources and destination, and blitter
  1086.     will copy the frame from end to start.
  1087.  
  1088.     BLTAFWM & BLTALWM (first word mask and last word mask)
  1089.     -----------------
  1090.     You can mask the start and the end of the zone you copy by using these
  1091.     registers. If you write the value %0011111111111111 into the register
  1092.     BLTAFWM, the leftmost 2 bits of each line of the copied block would
  1093.     never be set. It's like looking through a window, where only the 1's
  1094.     are made of glass. The FWM & LWM only have effect on the first word
  1095.     resp. last word, the words in between aren't effected.
  1096.     These regs aren't used often.
  1097.  
  1098.  
  1099.  
  1100.     In fact now you are able to write your own blitter routine. Please
  1101.     refer to the demo for practical examples. I'll now give a brief 
  1102.     explanation of how bobs work. I don't expect you to be making bobs 
  1103.     in the first few months, but you might also understand what it's all
  1104.     about.
  1105.  
  1106.     BOBS (experts only !)
  1107.     ----
  1108.     Bobs are probably the hardest stuff except for vector graphix, and
  1109.     I advise you to experiment a whole lot with blitter before starting
  1110.     with bobs.
  1111.     Bobs are pieces of graphics, that are put on a screen using the 
  1112.     blitter. Unlike sprites, where the HARDWARE does all the programming,
  1113.     bobs need much programming. If you have a picture at the background,
  1114.     and you put a spaceship or something on it, the background picture
  1115.     is lost. If you then move the ship, the background needs to be 
  1116.     restored. Therefore you must first save the piece of background on
  1117.     which you put the spaceship. Afterwards, you must put back this 
  1118.     background so that you won't see the spaceship anymore.  Sprites
  1119.     work the same way, but the hardware does it for us and you will agree
  1120.     that it is easier to work with sprites than to do it yourself.
  1121.     A special trick that is almost always used for bobs is the DOUBLE
  1122.     BUFFERING. 'refreshing' the bobs means you put the previously present
  1123.     backgrounds back on the screen (on top of the bobs), then put the
  1124.     various bobs back on their new position. The time it takes to repaint
  1125.     all the backgroundparts will grow when you have more bobs, and by the
  1126.     time all backgrouds are restored, the 1st bob will be 'gone' for 
  1127.     quite a long time before you are able to put it on the new position.
  1128.     As result you will see very nasty flickering on the screen.
  1129.     That's why Double Buffering is used: There are 2 images in memory,
  1130.     and each time you refresh the bobs, you switch the images. First
  1131.     you paint the bobs on one screen while showing the other, then you
  1132.     switch the pages and you put the bobs on the first screen while 
  1133.     showing the second... You won't notice the flickering on the one
  1134.     screen coz you are showing the other !  This way of working brings
  1135.     even more programming to it all, and above all, it GULPS memory !!
  1136.     As said: bobs are only for experts !!
  1137.  
  1138.     Another rather large problem that occurs when using bobs is the
  1139.     overlapping. A bob will consist of one or more bitplanes, which you
  1140.     must copy onto the desired spot of the screen.
  1141.     Source (the shape of the bob) is A, destination (background) is D.
  1142.     Now when you set the miniterms this way: 111,110,101,100
  1143.     this is what would happen:
  1144.  
  1145.  
  1146.  
  1147.  
  1148.  
  1149.     It's therefor necessary that you keep track of the background, and
  1150.     that's when the second and thirth source (B and C) come in handy.
  1151.     Your A source points to the image of your spaceship, and the B-source
  1152.     points to the background. Now you set the miniterms this way that
  1153.     the destination is lit when a bit of the spaceship is set OR a bit
  1154.     of the background is set.  That's better, coz look what will happen:
  1155.  
  1156.  
  1157.  
  1158.  
  1159.  
  1160.  
  1161.     As you see, large openings in your spaceship, which in fact belong
  1162.     to the ship, and which should NOT be transparant, are transparant,
  1163.     you can see the background through it. What's worse: if you use 
  1164.     more than 1 bitplane, the combination of 1's and 0's is relevant to
  1165.     get the correct color. But by using the miniterms of the previous
  1166.     example, these relevant 0's of your spaceship are not copied, the 
  1167.     bits of the background in fact disturb your image, and you'll get
  1168.     wrong colors. That is why we use MASKS (not the BLTAFWM and BLTALWM,
  1169.     but OWN MASKS). This mask has the shape of our spaceship, but all bits
  1170.     are set. Like this:
  1171.  
  1172.  
  1173.  
  1174.  
  1175.  
  1176.     Now when we copy our spaceship onto the background, this background
  1177.     may only be visible when it is OUTSIDE our spaceship, this means,
  1178.     when the bit in our MASK IS NOT SET !!  When the shape of the ship
  1179.     is in source A, and the background is in B, and te mask of the ship
  1180.     is in C, the miniterms would be the following:
  1181.     111,110,101,100 and 010
  1182.     Explanation: If a bit in the spaceship is set, this bit must be set
  1183.     in the destination ALWAYS (111,110,101 and 100)
  1184.                    ^   ^   ^       ^
  1185.     The last miniterm (010) means: when a bit in the spaceship is NOT
  1186.     set, the background may only be visible when the mask is not set.
  1187.     (=outside the spaceship)
  1188.     This way you prevent the background to be set under the shape
  1189.     of the spaceship...
  1190.